#include <string.h>
#include <iostream>

using std::cout;
using std::endl;

//char *pstr = "hello";
//pstr[0]
class CharArray
{
public:
    CharArray(size_t sz = 10)
    : _size(sz)
    , _data(new char[_size]())
    {
        cout << "CharArray(size_t = 10)" << endl;
    }

    //到底该不该加引用
    //1、什么时候需要使用引用符号？
    //思考：防止拷贝的，提高效率，需要使用引用；
    //修改变量本身的值的时候，需要使用引用
    //
    //2、C++中自定义的下标有什么优势？
    //思考：自定义的下标考虑越界的风险，所以更加安全
    //下标访问运算符的参数可以传递任意类型，比如：map
    char &operator[](size_t idx)
    {
        if(idx < _size)
        {
            return _data[idx];
        }
        else//idx越界
        {
            static char charNull = '\0';
            return charNull;
        }
    }

    size_t size() const
    {
        return _size;
    }

    ~CharArray()
    {
        cout << "~CharArray()" << endl;
        if(_data)
        {
            delete [] _data;
            _data = nullptr;
        }
    }
private:
    size_t _size;//存放数据的长度
    char *_data;//存放数据的指针
};

int main(int argc, char *argv[])
{
    //想将一个字符串传进来,拷贝给CharArray对象
    const char *pstr = "helloworld";
    CharArray ca(strlen(pstr) + 1);

    //赋值
    for(size_t idx = 0; idx != ca.size(); ++idx)
    {
        /* ca[idx] = pstr[idx]; */
        ca.operator[](idx) = pstr[idx];//赋值
                                       
        //char = 'a';
        /* 'a' = 'h';//error */
    }

    //遍历
    for(size_t idx = 0; idx != ca.size(); ++idx)
    {
        /* cout << ca[idx] << "  "; */
        cout << ca.operator[](idx) << "  ";
    }
    cout << endl;
    return 0;
}

